#include "wx/wxprec.h"

#if wxUSE_FONTPICKERCTRL && defined(__WXGTK24__)

#include "wx/fontpicker.h"

#include "wx/fontutil.h"        // for wxNativeFontInfo
#include "wx/gtk/private.h"

extern "C" {
  static void gtk_fontbutton_setfont_callback( GtkFontButton *widget,
      wxFontButton *p ) {
    // update the m_selectedFont member of the wxFontButton
    wxASSERT( p );
    p->SetNativeFontInfo( gtk_font_button_get_font_name( widget ) );
    // fire the colour-changed event
    wxFontPickerEvent event( p, p->GetId(), p->GetSelectedFont() );
    p->GetEventHandler()->ProcessEvent( event );
  }
}

//-----------------------------------------------------------------------------
// wxFontButton
//-----------------------------------------------------------------------------

IMPLEMENT_DYNAMIC_CLASS( wxFontButton, wxGenericFontButton )

bool wxFontButton::Create( wxWindow *parent, wxWindowID id,
                           const wxFont &initial,
                           const wxPoint &pos, const wxSize &size,
                           long style, const wxValidator& validator,
                           const wxString &name ) {
  if( !gtk_check_version( 2, 4, 0 ) ) {
    m_needParent = true;
    m_acceptsFocus = true;
    if( !PreCreation( parent, pos, size ) ||
        !wxControl::CreateBase( parent, id, pos, size, style, validator, name ) ) {
      wxFAIL_MSG( wxT( "wxFontButton creation failed" ) );
      return false;
    }
    m_widget = gtk_font_button_new();
    // set initial font
    m_selectedFont = initial.IsOk() ? initial : *wxNORMAL_FONT;
    UpdateFont();
    // honour the fontbutton styles
    bool showall = ( style & wxFNTP_FONTDESC_AS_LABEL ) != 0,
         usefont = ( style & wxFNTP_USEFONT_FOR_LABEL ) != 0;
    gtk_font_button_set_show_style( GTK_FONT_BUTTON( m_widget ), showall );
    gtk_font_button_set_show_size( GTK_FONT_BUTTON( m_widget ), showall );
    gtk_font_button_set_use_size( GTK_FONT_BUTTON( m_widget ), usefont );
    gtk_font_button_set_use_font( GTK_FONT_BUTTON( m_widget ), usefont );
    gtk_widget_show( GTK_WIDGET( m_widget ) );
    // GtkFontButton signals
    g_signal_connect( m_widget, "font-set",
                      G_CALLBACK( gtk_fontbutton_setfont_callback ), this );
    m_parent->DoAddChild( this );
    PostCreation( size );
    SetInitialSize( size );
  } else
    return wxGenericFontButton::Create( parent, id, initial, pos, size,
                                        style, validator, name );
  return true;
}

wxFontButton::~wxFontButton() {
}

void wxFontButton::UpdateFont() {
  if( !gtk_check_version( 2, 4, 0 ) ) {
    const wxNativeFontInfo *info = m_selectedFont.GetNativeFontInfo();
    wxASSERT_MSG( info, wxT( "The fontbutton's internal font is not valid ?" ) );
    const wxString& fontname = info->ToString();
    gtk_font_button_set_font_name( GTK_FONT_BUTTON( m_widget ), wxGTK_CONV( fontname ) );
  } else
  { wxGenericFontButton::UpdateFont(); }
}

#endif      // wxUSE_FONTPICKERCTRL && defined(__WXGTK24__)
